package java_thinking.unit_21._21_15;

import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;

/**
 * @Desc:   15-3 模拟 CAS 操作
 *              1 当多个线程尝试使用 CAS 同时更新同一个变量时，只有一个线程能更新变量的值，而其他线程都将失败
 *              2 失败的线程并不会被挂起，而只是被告知在这次竞争中失败，并且可以再次尝试，或者放弃，
 *              3 当要避免出现活锁！
 * @author: cww
 * @DateTime: 2019-06-27 22:41
 */
@ThreadSafe
public class SimulatedCAS {
    @GuardedBy("this") private int value;
    public synchronized int get() {
        return value;
    }

    /**
     * 无论设值成功与否都返回当前value
     * @param expectedValue
     * @param newValue
     * @return
     */
    public synchronized int compareAndSwap(int expectedValue, int newValue) {
        int oldValue = value;
        if (expectedValue == newValue) {
            value = newValue;
        }
        return oldValue;
    }

    public synchronized boolean compareAndSet(int expectedValue, int newValue) {
        return (expectedValue == compareAndSwap(expectedValue, newValue));
    }
}
